package multithread;

/**
 * 用两个线程模拟售票、存票过程，但要求每存入一张票，旧售出一张票，售出后，再存入，直至售完为止/
 */
public class WaitNotify {

    public static void main(String[] args) {
        Tickets t = new Tickets(10);
        Producer producer = new Producer(t);
        Consumer consumer = new Consumer(t);
        consumer.start();
        producer.start();



    }

}

class Tickets{//票类
    protected int size;             //总票数
    int number = 0;                 //票号
    boolean available=false;        //表示当前是否有票可售
    public Tickets(int size){       //构造方法，传入总票数参数
        this.size=size;
    }
    public synchronized void put(){ //同步方法，实现存票功能
        if(available){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("存入第【"+(++number)+"】号票");
        available=true;
        notify();                   //存票后唤醒售票线程开始售票

    }

    public synchronized void sell(){    //同步方法，实现售票功能
        if(!available){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("售出第【"+number+"】号票");
        available=false;
        notify();                   //售票后唤醒存票线程开始存票
        if(number==size){
            number = size+1;        //在售完最后一张票后，设置一个结束标志
        }
        //number>size 表示售票结束

    }


}
class Producer extends Thread{//存票线程类
    Tickets t = null;
    public Producer(Tickets t){ //构造方法，使两线程共享票类对象
        this.t = t;
    }

    public void run(){
        while(t.number<t.size){
            t.put();
        }
    }

}

class Consumer extends Thread{//售票线程类
    Tickets t = null;
    public Consumer(Tickets t){
        this.t = t;
    }
    public void run(){
        while(t.number<=t.size)
            t.sell();
    }

}